`include "ALU16.v"

module ALU16_tb;
    reg [15:0] a, b;
    reg sub;
    wire [15:0] result;
    wire cout, overflow;
    
    ALU16 alu(a, b, sub, result, cout, overflow);
    
    initial begin
        $monitor("Time=%0t: sub=%b, a=%h, b=%h, result=%h, cout=%b, overflow=%b", 
                 $time, sub, a, b, result, cout, overflow);
                 
        // 测试加法操作
        sub = 0;
        
        // 测试用例1: 正数加法，无溢出
        a = 16'h1000;  // 4096
        b = 16'h2000;  // 8192
        #10;           // 期望: 12288, no overflow
        
        // 测试用例2: 正数加法，有溢出 (最大正数 + 1)
        a = 16'h7FFF;  // 32767 (最大正数)
        b = 16'h0001;  // 1
        #10;           // 期望: 8000 (-32768), overflow=1
        
        // 测试用例3: 负数加法，无溢出
        a = 16'hF000;  // -4096
        b = 16'hE000;  // -8192
        #10;           // 期望: -12288, no overflow
        
        // 测试用例4: 负数加法，有溢出 (最小负数 + (-1))
        a = 16'h8000;  // -32768 (最小负数)
        b = 16'hFFFF;  // -1
        #10;           // 期望: 7FFF (32767), overflow=1
        
        // 测试用例5: 正负数加法，无溢出
        a = 16'h1000;  // 4096
        b = 16'hF000;  // -4096
        #10;           // 期望: 0, no overflow
        
        // 测试减法操作
        sub = 1;
        
        // 测试用例6: 正数减法，无溢出
        a = 16'h3000;  // 12288
        b = 16'h1000;  // 4096
        #10;           // 期望: 8192, no overflow
        
        // 测试用例7: 正数减负数，有溢出
        a = 16'h7000;  // 28672
        b = 16'h9000;  // -28672
        #10;           // 期望: 可能溢出
        
        // 测试用例8: 负数减正数，有溢出
        a = 16'h9000;  // -28672
        b = 16'h7000;  // 28672
        #10;           // 期望: 可能溢出
        
        // 测试用例9: 负数减法，无溢出
        a = 16'hF000;  // -4096
        b = 16'hE000;  // -8192
        #10;           // 期望: 4096, no overflow
        
        // 测试用例10: 边界情况 - 0减最小负数
        a = 16'h0000;  // 0
        b = 16'h8000;  // -32768
        #10;           // 期望: 溢出
        
        // 测试用例11: 最大正数减(-1)
        a = 16'h7FFF;  // 32767
        b = 16'hFFFF;  // -1
        #10;           // 期望: 可能溢出
        
        $finish;
    end
    
endmodule
